#ifndef PROJECTINFOIMPORT_H
#define PROJECTINFOIMPORT_H

#include <QObject>
#include <QDebug>
#include <QFile>
#include <QtXml/QtXml>
#include "datatypedefinition.h"
#include "constantdefinition.h"
#include "constantimport.h"


//操作符
struct Operator
{
    QString operatorName;//操作符名字

    bool isSeparate;//是否有独立文件

    QDomNode operatorNode;//operator节点

    QString cFilePath;

    QString path;//位置

    QString operatorFileName;//操作符文件名
};

//package
struct Package
{
    QString packageName;//package名

    bool isSeparate;//是否有独立文件

    QDomNode packageNode;//package节点

    QString path;//位置

    QString packageFileName;//package文件名

    QList<Operator> operators;//package中的操作符

    QList<Package> childPackages;//package中的package
};

//外部代码
struct External_Code
{
    QString codeFileName;//代码文件名

    QString operatorName;//代码关联的操作符名
};

//SCADE工程信息
typedef struct SCADEProInfo
{
    QString version;//SCADE语言版本

    QList<QString> libraries;//算法库

    QString defaultFile;//默认模型文件

    QList<Operator> opeartors;//操作符

    QList<Package> packages;//package

    QStringList projectLibsName;

    QList<SCADEProInfo> projectLib;//工程库

    QList<External_Code> externalCodes;//外部代码

    DataTypeDefine::DataTypeList typeList; //类型定义

    QStringList logList;

}*P_SCADEProInfo;

//REDACE工程信息
struct REDACEProInfo
{
    QList<QString> operatorCFilePath;//代码文件路径

    QString commFilePath;//默认模型文件

    QList<Operator> opeartors;//操作符

    QList<QString> libPath;//算法库
};

class ProjectInfoImport : public QObject
{
    Q_OBJECT
public:
    explicit ProjectInfoImport(QObject *parent = nullptr);

    SCADEProInfo sProInfo;//SCADE工程信息

    REDACEProInfo rProInfo;//REDACE工程信息

    /**
     * @brief packageParse          解析Package信息，获取该工程的package和操作符的树状结构
     * @param filePath              SCADE工程的绝对路径
     * @param parentPackage         该package信息所在的package
     * @param root                  Package信息节点
     * @return
     */
    void packageParse(QString filePath,Package &parentPackage,QDomElement root);

    /**
     * @brief proInfoParse          解析SCADE工程的工程信息
     * @param SCADEProjectFilePath  SCADE工程文件文件路径
     * @return
     */
    void proInfoParse(QString defaultfile,QString scadeProjectFilePath,P_SCADEProInfo projectInfo);

    /**
     * @brief proInfoProcess        处理SCADE工程的工程信息转换成REDACE工程信息
     * @return
     */
    void proInfoProcess(QFile &file);

    /**
     * @brief generateSolutionFile  生成解决方案文件
     * @param redaceProjectPath     REDACE工程位置
     * @param scadeProjectName      工程名
     * @return
     */
    void generateSolutionFile(QString redaceProjectPath,QString scadeProjectName);

    /**
     * @brief generateProjectFile   生成工程文件
     * @param redaceProjectPath     REDACE工程位置
     * @param scadeProjectName      工程名
     * @return
     */
    void generateProjectFile(QString redaceProjectPath,QString scadeProjectName);

};

#endif // PROJECTINFOIMPORT_H
